# https://blog.csdn.net/qq_35462323/article/details/89307534

# https://www.cnblogs.com/yeer-xuan/p/13497494.html

# 存在__call__方法的类对象被称为可调用对象，它的作用可以总结为以下两点：
#
# 简化了对象下方法的调用  (当某方法调用频率很高)
# 模糊了对象和函数调用时的区别  (提高了代码的兼容性)

# 如果call的参数是(self, *args, **kwargs)，那么可以传入任意的参数。
# 大概率return 另一个类的，如：b(self, *args, **kwargs)，这样才会调用


# 使用__call__前
# class A():
#     def m(self):
#         print('a')
#     def n(self):
#         print('b')
#
# a = A()
# a.m()


# _init__()的作用是初始化某个类的一个实例。
# __call__()可以用来改变实例的内部成员的值。
# __call__()。该方法的功能类似于在类中重载 ()
# 如果_init_没有参数，_call_有，那么_call_第一次就调用，如果_init_有参数，那么_call_第二次调用

# 使用__call__后
class A():
    def __init__(self):
        print("_init_")
        self.i = 1

    def __call__(self, *args, **kwargs):
        print("_call_")

    def __getattr__(self, method):  # 12 waitForExists
        self.method = method
        return self

    def n(self):
        print('b')

a = A()
# a("1")                             # a可以自己调用，而不用属性或者方法。
# a.name()                             # 因为有getattr 所以可以任意"变量"的函数，最后返回self，即call方法。